package com.moyun.common.excel;

import com.alibaba.excel.EasyExcel;
import com.moyun.common.enums.CodeEnum;
import com.moyun.model.common.R;
import com.moyun.common.utils.ResultUtil;
import com.moyun.common.excel.listener.SomeOneExcelListener;
import com.moyun.common.excel.model.Person;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * <h3>moyun-base</h3>
 * <p>easyExcel的demo</p>
 *
 * @author : ybx
 * @date : 2022-03-30 21:44:11
 **/
@Api(tags = "Excel导入导出")
@Slf4j
@Controller
public class EasyExcelDemoController {

    private static final String FILE_ZIP = "zip";
    private static final String FILE_XLS = ".xls";
    private static final String FILE_XLSX = ".xlsx";


    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        // 设定请求头内容
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 设定请求编码
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 其中DemoData是加了 EasyExcel注解的实体类,data()方法获取的是一个List类型的列表数据
        // 这种写法,response流会自动关闭
        // 请求头,填充的数据
        EasyExcel.write(response.getOutputStream(), Person.class).sheet("模板").doWrite(new ArrayList<>());

    }


    @PostMapping("import")
    @ResponseBody
    public R upload(@RequestParam("file") MultipartFile multipartFile) throws IOException {
        /**
         * 判断文件类型是否正确
         */
        if (multipartFile == null) {
//            HttpServletResponseUtil.printJson(JSON.toJSONString(ResultUtil.fail(CodeEnum.ERROR_EXCEL_TYPE)));
            return ResultUtil.fail(CodeEnum.ERROR_EXCEL_TYPE);
        }
        String originalFilename = multipartFile.getOriginalFilename();
        String fileType = null;
        if (originalFilename != null) {
            fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        /**
         * 先判断后缀名
         */
        if (!(FILE_XLS.equalsIgnoreCase(fileType) || FILE_XLSX.equalsIgnoreCase(fileType))) {
            return ResultUtil.fail(CodeEnum.ERROR_EXCEL_TYPE);
        }
        // 这里有一个bug,第二个参数 Class head,如果设置了,那么第三个参数 ReadListener readListener 指定的泛型不起作用。有参构造,指定的参数也不起作用
        // 具体请查看官网的 issues https://github.com/alibaba/easyexcel/issues/93 AnalysisEventListener 不支持泛型吗，我一个子类继承AnalysisEventListener
//        EasyExcel.read(multipartFile.getInputStream(), Person.class, new MyExcelImportAnalysisEventListener(new SysSettingVo()))
//                .sheet().doRead();

        SomeOneExcelListener<Person> listener = new SomeOneExcelListener<>();

        /*EasyExcel.read(multipartFile.getInputStream(), listener)
                .sheet().doRead();*/

        /**
         * 进行数据读取入库操作
         */
        EasyExcel.read(multipartFile.getInputStream(), Person.class, listener)
                .sheet().doRead();


        List<List<Object>> errorData = listener.getErrorData();
        EasyExcel.write("C:\\Users\\Yangboxuan\\Desktop\\error.xlsx").head(listener.getHead()).sheet("模板").doWrite(errorData);
        if (errorData.size() > 0) {
            return ResultUtil.fail(1, errorData.toString());
        } else {
            return ResultUtil.success();
        }
    }


}
